package com.heima.advice;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
 * 1. 导入依赖 ospectj ,spring-com.itheima.config-text
 * 2. 写通知类 - 写通知方法
 * 3. 定义切点
 * 4. 把通知类变为切面类
 * 5. 开启spring aop支持
 */
//被扫描
@Component
//切面注解
//@Aspect
public class MyAdvice {
   /* //切入点表达式（方法修饰符 方法返回值 包名，类名，方法名（参数类型））
    @Pointcut("execution(void com.heima.com.itheima.dao.BookDao.update())")
    private void pt(){

    }

    @Before("pt()")
    public void advice(){
        System.out.println(System.currentTimeMillis());
    }*/

    @Pointcut("execution(* com.heima.dao.BookDao.update(..))")
    private void ss(){

    }

    //前置通知 --获取参数信息并打印
    @Before("ss()")
    public void before(JoinPoint point){
        Object[] args = point.getArgs();
        System.out.println("调用了除法：除法的参数为" + args[0] + "," +args[1]);
    }

    @After("ss()")
    public void after(){
        System.out.println("除法调用完成");
    }

    //返回通知 - 在拿到返回结果之后执行（获取返回结果）
    @AfterReturning(value = "ss()" ,returning = "obj")
    public void returning(JoinPoint point ,Object obj){
        System.out.println("得到除法的计算结果为：" + obj);
    }

    //异常通知 - 方法出现异常的时候调用
    //value 切点
    //throwing 异常对象  方法参数和t一样
    @AfterThrowing(value = "ss()" , throwing = "t")
    public void throwing(Throwable t){
        System.out.println("计算结果异常：异常信息为：" + t.getMessage());
    }

    //环绕通知
    @Around("ss()")
    public Object around(ProceedingJoinPoint pjp){
        System.out.println("环绕前置通知");

        Object proceed = null;
        try {
            Integer[] args = {3,0};
            proceed = pjp.proceed(args);
            System.out.println("环绕返回通知" + proceed);
        } catch (Throwable e) {
            e.printStackTrace();
            System.out.println("环绕异常通知" + e.getMessage());
        }
        System.out.println("环绕后置通知");

        return proceed;
    }
}
